package main

import "fmt"

/*
子类实例，可以赋值父类接口实例
子类实例，不能赋值父类结构体实例
能赋值就能断言
结构体不存在所谓断言，断言都是对接口实例进行的
【接口实例】可以断言为【父类接口】或【子类结构体指针】
*/

/*
子类结构体LoveFilm		父类接口IFilm 		父类结构体Film
子类实例					父类接口实例			父类结构体实例
lf						ifilm				film
ifilm = lf	√		lf.(IFilm) 	√
film = lf	×		lf.(Film)	×
*/

type IFilm interface {
	OnShow()
}

type Film struct {
	Name string
}

func (f *Film) OnShow() {
	fmt.Println("电影上映")
}

type LoveFilm struct {
	Film
}

func (f *LoveFilm) OnShow() {
	fmt.Println("爱情片上映")
}

func main() {
	var ifilm IFilm
	loveFilm := &LoveFilm{Film{"撸码痴汉"}}

	//【子类实例】可以赋值【父类接口】
	ifilm = loveFilm
	fmt.Println(ifilm,loveFilm)

	if ret,ok := ifilm.(IFilm);ok{
		fmt.Println("断言为接口成功")
		fmt.Printf("ret的类型是%T,value是%v\n",ret,ret)
	}
	if ret,ok := ifilm.(*Film);ok{
		fmt.Println("断言为父类成功")
		fmt.Printf("ret的类型是%T,value是%v\n",ret,ret)
	}
	if ret,ok := ifilm.(*LoveFilm);ok{
		fmt.Println("断言为子类成功")
		fmt.Printf("ret的类型是%T,value是%v\n",ret,ret)
	}

}

/*func main02() {

	var film Film
	loveFilm := LoveFilm{Film{"撸码痴汉"}}

	//【子类实例】不能赋值【父类结构体】
	film = loveFilm
	fmt.Println(film, loveFilm)

}*/
